package broker

import (
	"fmt"
	"sync"
)

var (
	instance *PubSubBroker
	once     sync.Once
	initOnce sync.Once
	initErr  error
)

// 显式的单例初始化函数
func InitBroker() error {
	initOnce.Do(func() {
		fmt.Println("Initializing PubSubBroker...")
		instance = &PubSubBroker{
			subscribers: make(map[chan Message]bool),
		}
	})
	return initErr
}

// 获取已经初始化的单例实例
func BrokerInstance() *PubSubBroker {
	once.Do(func() {
		if instance == nil {
			err := InitBroker()
			if err != nil {
				return
			} // 如果尚未初始化，则显式调用初始化函数
		}
	})
	return instance
}

// 定义消息结构
type Message struct {
	Content string
}

// 定义 broker 用于管理订阅和发布
type PubSubBroker struct {
	subscribers map[chan Message]bool
	mu          sync.Mutex
}

func NewPubSubBroker() *PubSubBroker {
	return &PubSubBroker{subscribers: make(map[chan Message]bool)}
}

// 订阅，返回一个通道供订阅者接收消息
func (b *PubSubBroker) Subscribe() chan Message {
	b.mu.Lock()
	defer b.mu.Unlock()
	ch := make(chan Message)
	b.subscribers[ch] = true
	return ch
}

// 取消订阅
func (b *PubSubBroker) Unsubscribe(ch chan Message) {
	b.mu.Lock()
	defer b.mu.Unlock()
	delete(b.subscribers, ch)
	close(ch)
}

// 发布消息到所有订阅者
func (b *PubSubBroker) Publish(msg Message) {
	b.mu.Lock()
	defer b.mu.Unlock()
	for ch := range b.subscribers {
		ch <- msg
	}
}
